package yc.web.servlets;

import yc.bean.CartItem;
import yc.bean.Resfood;
import yc.web.model.JsonModel;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@WebServlet("/resorder.action")
public class ResorderServlet extends BaseServlet{
    protected void order(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //购物车操作
        JsonModel jm = new JsonModel();
        //1.判断是否登录
        HttpSession session=req.getSession();
//        if (session.getAttribute("user")==null){
//            jm.setCode(-1);
//            super.writeJson(jm,resp);
//            return;
//        }
        int fid=Integer.parseInt(req.getParameter("fid"));
        int num=Integer.parseInt(req.getParameter("num"));
        //根据fid查出 resfood对象，再放到购物车。
        //a.根据fid查数据库
        String sql="select * from resfood where fid=?";
        List<Resfood> list=db.select(Resfood.class,sql,fid);
        Resfood food=null;
        if (list!=null&&list.size()>0){
            food=list.get(0);
        }
        //根据fid从session中取
        //List<Resfood>list=(List<Resfood>)session.getAttribute("foodList")//性能会好，但是不利于前端测试。
        //2.添加购物车。
        //session： 一个客户端一个session（存 map<fid,购物项对象>）
        Map<Integer, CartItem>cart=new HashMap<Integer,CartItem>();
        if (session.getAttribute("cart")!=null){
            cart= (Map<Integer, CartItem>) session.getAttribute("cart");
        }else{
            session.setAttribute("cart",cart);
        }
        CartItem ci=null;//购物项
        if (cart.containsKey(fid)){
            //如果为true，说明原来下过单则增加数量
            ci=cart.get(fid);
            int newNum= ci.getNum()+num;
            ci.setNum(newNum);
        }else {
            ci=new CartItem();
            //设置这个新购物项的的信息
            ci.setFood(food);
            ci.setNum(num);
        }
        //容错
        if (ci.getNum()<=0){
            cart.remove(fid);
        }else {
            //计算小计
            ci.getSmallCount();
            //存入购物车
            cart.put(fid,ci);
        }
        session.setAttribute("cart",cart);
        jm.setCode(1);
        //cart是一个map，我们取这个map的值: Set[CartItem,CartItem,CartItem]
        jm.setObj(cart.values());
        //         购物项对象
        //         Resfood对象 数量 小计
        //逻辑：1.先从session中取出map，2.判断 这个map中是否有要购物的fid（containsKey）.
        //3.如果有，则从map中取出fid对应的 购物项目，将购物项中的数量+1
        //如果没有，要创建一个购物项对象，以fid做键，存到map中
        //4.将map存到session中。
        super.writeJson(jm,resp);

    }
    protected void clearAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, InvocationTargetException, InstantiationException, IllegalAccessException {
        JsonModel jm = new JsonModel();
        HttpSession session=req.getSession();
        session.removeAttribute("cart");
        jm.setCode(1);
        super.writeJson(jm,resp);
    }
    protected void getCartInfo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, InvocationTargetException, InstantiationException, IllegalAccessException {
        JsonModel jm = new JsonModel();
        HttpSession session=req.getSession();
        if (session.getAttribute("cart")!=null){
            jm.setCode(1);
           Map<Integer,CartItem> cart= (Map<Integer, CartItem>) session.getAttribute("cart");
            jm.setObj(cart.values());
        }else {
            jm.setCode(0);
        }
        super.writeJson(jm,resp);
    }
}
